package ar.edu.utn.frsf.tpae.a2014.g03.persistence.dao.impl;

import java.util.ArrayList;
import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.criterion.Restrictions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import ar.edu.utn.frsf.tpae.a2014.g03.enums.EstadoPedidoEnum;
import ar.edu.utn.frsf.tpae.a2014.g03.persistence.dao.HistorialPedidoDAO;
import ar.edu.utn.frsf.tpae.a2014.g03.persistence.model.HistorialPedido;
import ar.edu.utn.frsf.tpae.a2014.g03.persistence.model.Pedido;

@Repository
public class HistorialPedidoHibernateDao implements HistorialPedidoDAO {

	private SessionFactory sessionFactory;

	// Setter utilizado por Spring.
	@Autowired
	public void setSessionFactory(SessionFactory factory) {
		this.sessionFactory = factory;
	}

	private Session getCurrentSession() {
		return sessionFactory.getCurrentSession();
	}

	@Override
	public HistorialPedido persistir(HistorialPedido historialPedido) {
		HistorialPedido entity = historialPedido;
		if (entity != null) {
			getCurrentSession().saveOrUpdate(entity);
		}
		return entity;
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<Pedido> findPedidosEnCurso(Integer idCliente) {

		Criteria criteria = getCurrentSession().createCriteria(
				HistorialPedido.class);
		criteria.add(Restrictions.not(Restrictions.eq(HistorialPedido.ESTADO,
				EstadoPedidoEnum.ENTREGADO)));
		criteria.createAlias(HistorialPedido.PEDIDO, HistorialPedido.PEDIDO);
		criteria.createAlias(HistorialPedido.PEDIDO_CLIENTE,
				HistorialPedido.PEDIDO_CLIENTE);
		criteria.add(Restrictions.eq(HistorialPedido.PEDIDO_CLIENTE_ID,
				idCliente));

		return criteria.list();
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<Pedido> findPedidosFinalizados(Integer idCliente) {
		List<Pedido> listaPedidos = new ArrayList<Pedido>();
		if (idCliente == null) {
			return listaPedidos;
		}

		listaPedidos = getCurrentSession()
				.createQuery(
						"select hp.pedido from HistorialPedido hp where hp.estado = 'ENTREGADO' and hp.pedido.cliente.id = '"
								+ idCliente + "'").list();

		return listaPedidos;
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<Pedido> findPedidosByEstado(EstadoPedidoEnum estado) {
		List<Pedido> listaPedidos = new ArrayList<Pedido>();

		listaPedidos = getCurrentSession().createQuery(
				"select hp.pedido from HistorialPedido hp where hp.estado='"
						+ estado.name() + "'").list();


		return listaPedidos;
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<HistorialPedido> findHistorialByPedido(Integer idPedido) {
		List<HistorialPedido> listaPedidos = new ArrayList<HistorialPedido>();
		if (idPedido == null) {
			return listaPedidos;
		}

		listaPedidos = getCurrentSession().createQuery(
				"from HistorialPedido hp where hp.pedido.id = '" + idPedido
						+ "'").list();

		return listaPedidos;
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<Pedido> findPedidosAsignados(Integer idTransportista) {
		List<Pedido> listaPedidos = new ArrayList<Pedido>();
		if (idTransportista == null) {
			return listaPedidos;
		}

		listaPedidos = getCurrentSession()
				.createQuery(
				"select hp.pedido from HistorialPedido hp where (hp.estado='"
						+ EstadoPedidoEnum.A_RETIRAR.toString()
						+ "' OR hp.estado='"
						+ EstadoPedidoEnum.EN_TRANSPORTE.toString()
						+ "')and hp.estado!='" + EstadoPedidoEnum.ENTREGADO
						+ "' and hp.pedido.transportista.id = '"
								+ idTransportista + "'").list();
		return listaPedidos;
	}

	@Override
	public void deleteAll() {
		getCurrentSession().createQuery("delete from HistorialPedido")
				.executeUpdate();
	}

}
